package com.hejing.日期时间API.JDK8里面的日期时间API;

import org.junit.Test;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
import java.util.Date;

/**
 * ClassName: DateTimeTest
 * Package: com.hejing.日期时间API.JDK8里面的日期时间API
 * Description:
 *
 * @Author: HeJing
 * @Create: 2023-04-17 10:10
 * @Version: 1.0
 */
public class DateTimeTest {

    /**
     * (1) 可变性: 像日期和时间这样的类应该是不可变的。
     * (2) 偏移性: Date中的年份是从1900开始的,而月份都从0开始。
     * (3) 格式化: 格式化只对Date有用, Calendar则不行。
     * (4) 此外，它们也不是线程安全的，以及不能处理闰秒等。
     */
    @Test
    public void test01(){

        // calendar 的可变性
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH, 23);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));  // 23


    }

    // (2) 偏移性:  Date中的年份是从1900开始的,而月份都从0开始。
    @Test
    public void test02(){
        Date date = new Date(2022, 11, 14);
        System.out.println(date);  // Thu Dec 14 00:00:00 CST 3922
    }

    //  (3) 格式化: 格式化只对Date有用, Calendar则不行。
    //  (4) 此外，它们也不是线程安全的，以及不能处理闰秒等。

    // ******************************************************************************** \\

    /**
     * JDK8中的api:
     *      LocalDate
     *      LocalTime
     *      LocalDateTime
     */
    @Test
    public void test03(){
        // 实例化： now() or of(xxx, xxx....)
        // now(): 静态方法，获取当前日期和时间的实例
        LocalDate localDate = LocalDate.now();
        LocalTime localTime = LocalTime.now();
        LocalDateTime localDateTime = LocalDateTime.now();

        System.out.println(localDateTime);  // 2023-04-17T19:54:36.793949400
        System.out.println(localTime);      // 19:54:36.793949400
        System.out.println(localDate);      // 2023-04-17

        // of():静态方法，获取指定日期/时间创建对象
        LocalDate localDate1 = LocalDate.of(2021, 5, 31);
        LocalDateTime localDateTime1 = LocalDateTime.of(2022, 12, 5, 22, 12, 32);
        System.out.println(localDate1);     // 2021-05-31
        System.out.println(localDateTime1); // 2022-12-05T22:12:32

        // getXXX
        LocalDateTime localDateTime2 = LocalDateTime.now();
        System.out.println(localDateTime2.getDayOfMonth());  // getDayOfMonth(): 获取当日是本月的第x天

        // 体现不可变性
        LocalDateTime localDateTime3 = localDateTime2.withDayOfMonth(12);
        System.out.println(localDateTime3);     // 2023-04-12T20:06:30.595650500
        System.out.println(localDateTime2);     // 2023-04-17T20:06:30.595650500

        // plusDays(int num): 在原有的日期基础上增加 num天
        LocalDateTime localDateTime4 = localDateTime2.plusDays(5);
        System.out.println(localDateTime4);     // 2023-04-22T20:08:50.408991400

        // minusDays(int num): 在原有的基础上减去 num天
        LocalDateTime localDateTime5 = localDateTime2.minusDays(5);
        System.out.println(localDateTime5);     // 2023-04-12T20:10:31.511784
    }

    /**
     * Instant
     */
    @Test
    public void test04(){

        Instant instant = Instant.now();
        System.out.println(instant);  // 2023-04-17T12:26:53.542490900Z

        // 了解
        OffsetDateTime instant1 =  instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println(instant1);

        //
        Instant instant2 = Instant.ofEpochMilli(23132332323L);
        System.out.println(instant2);  // 1970-09-25T17:38:52.323Z

        long millTime = instant2.toEpochMilli();
        System.out.println(millTime);  // 23132332323


    }

    /**
     * JDK8中的API: dateTimeFormatter的使用
     */
    @Test
    public void test05(){
        // 自定义格式：ofPattern("yyyy-MM-dd hh:mm:ss"
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");

        // 格式化: 日期时间--> 字符串
        LocalDateTime localDateTime = LocalDateTime.now();
        String strDateTime = dateTimeFormatter.format(localDateTime);
        System.out.println(strDateTime);  // 2023-04-17 08:39:58

        // 解析: 字符串--> 日期时间
        TemporalAccessor parse = dateTimeFormatter.parse("2023-04-17 08:39:58");
        System.out.println(parse);

    }
}


























